Icons
Material icons use geometric shapes to visually represent core ideas, capabilities, or topics.
Setup
Icons are not part of the official material-components-web spec, but they are referenced many times in the documentation. RMWC provides a declarative way to use icons. Note that RMWC does not ship with any icons of its own. You can include Material Icons, any other font icon set, use SVGs, or your own images.
By default, the Icon component will attempt to detect the strategy for the icon you are embedding. For example, it assumes if pass something that starts with http://
to the icon
prop that you are attempting to load an image and will render it accordingly. Beacuse of ambiguity with ligatures verses icons added using classNames, you might have to explicitly set the strategy by passing it in as an option, or setting it as a global default using the RMWCProvider
.RMWCProvider
provides other global icon options. Please see the "Provider" section for more detail.
The default strategy is 'ligature' which works with the material.io font icon set.
Basic Usage
The Icon component, (really the icon prop itself) can accept a variety of formats. Anywhere you see a component prop like icon
or trailingIcon
will inherit the same behavior.
<Icon icon="favorite" />
<Icon
icon={
<div
style={{
background: 'green',
width: '24px',
height: '24px',
borderRadius: '100px'
}}
/>
}
/>
<>
{}
<Icon icon={{ icon: 'star', strategy: 'ligature' }} />
{}
<Button
label="Hello!"
icon={{
icon: 'add',
onMouseOver: () => console.log('OVER')
}}
/>
</>
Icon Sizing
The Material spec details multiple sizes for icons. The Icon component doesn't assign a size by default, but these are available to you to force a size. Please note, this will only work if you've included the RMWC icon css file.
<>
{}
<Icon icon={{ icon: 'favorite', size: 'xsmall' }} />
{}
<Icon icon={{ icon: 'favorite', size: 'small' }} />
{}
<Icon icon={{ icon: 'favorite', size: 'medium' }} />
{}
<Icon icon={{ icon: 'favorite', size: 'large' }} />
{}
<Icon icon={{ icon: 'favorite', size: 'xlarge' }} />
</>
Ligatures
This is for icon fonts that support ligatures like material-icons. This is the default strategy if nothing is set and doesn't require any additional setup if you are using material-icons.
<>
<Icon icon="favorite" />
<Icon icon="favorite_outline" />
{}
<Icon icon={{ icon: 'star', strategy: 'ligature' }} />
</>
URLs
This is for icons that are accessible via HTTP(S) and will be loaded directly into an img
tag. This can be auto-detected for things that look like urls. The image will be set as a backgroundImage of the icon. Make sure you impor the RMWC icon css file for this to work properly.
<>
{}
<Icon icon="images/icons/twitter.png" />
{}
<Icon
icon={{
icon: 'images/icons/twitter.png',
strategy: 'url'
}}
/>
</>
Components / Inline SVGs
This will render a child component inside of the icon. This is useful for all sorts of customization and for rendering inline SVGs. The following example shows rendering an SVG, as well as an arbitrary div
.
<>
{}
<Icon
icon={
<div
style={{
background: 'green',
width: '24px',
height: '24px',
borderRadius: '100px'
}}
/>
}
/>
{}
<Icon
icon={{
strategy: 'component',
icon: (
<svg
style={{ width: '24px', height: '24px' }}
viewBox="0 0 24 24"
>
<path
fill="#4285F4"
d="M21.35,11.1H12.18V13.83H18.69C18.36,17.64 15.19,19.27 12.19,19.27C8.36,19.27 5,16.25 5,12C5,7.9 8.2,4.73 12.2,4.73C15.29,4.73 17.1,6.7 17.1,6.7L19,4.72C19,4.72 16.56,2 12.1,2C6.42,2 2.03,6.8 2.03,12C2.03,17.05 6.16,22 12.25,22C17.6,22 21.5,18.33 21.5,12.91C21.5,11.76 21.35,11.1 21.35,11.1V11.1Z"
/>
</svg>
)
}}
/>
</>
Classnames
Some font icon sets like Ion Icons and Glyph Icons render based on a className that is set. RMWC docs doesn't include extra icon fonts so there is no example to render, but the below code should give you an approximation.
THIS CANNOT BE AUTO DETECTED. You'll have to explicitly set the strategy directly on the Icon or specify it globally via the RMWCProvider.
<>
{}
<Icon
icon={{
icon: 'star',
strategy: 'className',
basename: 'icon',
prefix: 'ion-'
}}
/>
{}
<RMWCProvider
icon={{
strategy: 'className',
basename: 'glyphicons',
prefix: 'glyphicons-'
}}
>
<Icon icon="heart" />
</RMWCProvider>
</>
Custom Rendering
Sometimes, you just need to do your own thing. Maybe you have a legacy project that already has icons and you want to incorporate them with RMWC. If none of the other strategies are what you need, then you can hijack the whole thing and delegate it to your own render function.
<Icon
icon={{
icon: 'favorite',
strategy: 'custom',
render: ({ content }) => <div>Hello + {content}</div>
}}
/>
A more relevant example involves an app that has a custom / existing icon component. There are a litany of reasons why your app might need one, but if you've found this section of the docs you likely know what problem you need to solve.
import { MyIconComponent } from '@rmwc/icon';
<MyIconComponent name="search" />
import { TextField } from '@rmwc/textField';
import { Chip } from '@rmwc/chip';
<TextField icon="favorite" />
<Chip icon="favorite" />
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import App from './App';
import { RMWCProvider } from '@rmwc/provider';
import { MyIconComponent } from '@rmwc/icon';
const iconRenderHandler = ({ content, className, ...rest }) => {
return <MyIconComponent className={className} name={content} {...rest} />
};
ReactDOM.render(
<RMWCProvider icon={{strategy: 'custom', render: iconRenderHandler}}>
<App />
</RMWCProvider>,
document.getElementById('root')
);
import { TextFieldIcon } from '@rmwc/textfield';
<TextFieldIcon icon="search" />
Icon
An Icon component. Most of these options can be set once globally, read the documentation on Provider for more info.
Props
Name | Type | Description |
---|
icon | RMWC.IconPropT | The icon to use. This can be a string for a font icon, a url, or whatever the selected strategy needs. |